package main

import (
	"context"
	"fmt"
	"go.etcd.io/etcd/clientv3"
	"time"
)

func main() {
	var (
		config clientv3.Config
		client *clientv3.Client
		err error
		kv clientv3.KV
		putResp *clientv3.PutResponse
	)

	// 客户端配置
	config = clientv3.Config{
		Endpoints:            []string{"127.0.0.1:2379"}, // 集群列表
		DialTimeout:          5 * time.Second,
	}

	// 建立一个客户端
	if client, err = clientv3.New(config); err != nil {
		fmt.Println(err)
		return
	}

	// 用于读写etcd的键值对
	kv = clientv3.NewKV(client)

	if putResp, err = kv.Put(context.TODO(), "/cron/jobs/job1", "bye", clientv3.WithPrevKV()); err != nil {
		fmt.Println(err)
	} else {
		fmt.Println("Revision: ", putResp.Header.Revision)
		// PrevKv可以获取上个version的value，Put()时需要追加clientv3.WithPrevKV()选项
		if putResp.PrevKv != nil { // 若前一个值没有变化，PreKv是空，打印hello
			fmt.Println("PrevValue: ", string(putResp.PrevKv.Value))
		}
	}
	// context 上下文，可以取消执行中的shell命令，也可以取消put操作
	// 即使方法允许，也不要传入一个 nil 的 Context ，如果你不确定你要用什么 Context 的时候传一个 context.TODO
	// 上下文，就是包含各种变量的语境
}
